package com.glory.gloryquickui.utils

import android.annotation.TargetApi
import android.app.Activity
import android.content.Context
import android.graphics.Rect
import android.os.Build
import android.util.DisplayMetrics
import android.view.WindowManager

/**
 * Created by Jerome on 2018/6/27
 */
class ScreenUtil {
    /**
     * 获取状态栏高度
     * @param context
     * @return
     */
    private fun getStatusBarHeight(context: Context): Int {
        var result = 0
        val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
        if (resourceId > 0) {
            result = context.resources.getDimensionPixelSize(resourceId)
        }
        return result
    }

    companion object {
        fun dip2px(context: Context, dpValue: Float): Int {
            val scale = context.resources.displayMetrics.density
            return (dpValue * scale + 0.5f).toInt()
        }

        fun px2dip(context: Context, pxValue: Float): Int {
            val scale = context.resources.displayMetrics.density
            return (pxValue / scale + 0.5f).toInt()
        }

        fun dp2px(context: Context, dp: Int): Int {
            val displayMetrics = context.resources.displayMetrics
            return (dp * displayMetrics.density + 0.5).toInt()
        }

        fun px2sp(context: Context, pxValue: Float): Int {
            val fontScale = context.resources.displayMetrics.scaledDensity
            return (pxValue / fontScale + 0.5f).toInt()
        }

        // 屏幕宽度（像素）
        fun getWindowWidth(activity: Activity): Int {
            val metric = DisplayMetrics()
            activity.windowManager.defaultDisplay.getMetrics(metric)
            return metric.widthPixels
        }

        // 屏幕高度（像素）
        fun getWindowHeight(activity: Activity): Int {
            val metric = DisplayMetrics()
            activity.windowManager.defaultDisplay.getMetrics(metric)
            return metric.heightPixels
        }

        fun getStatusHeight(context: Context): Int {
            var statusHeight = -1
            try {
                val clazz = Class.forName("com.android.internal.R\$dimen")
                val `object` = clazz.newInstance()
                val height = clazz.getField("status_bar_height")[`object`].toString().toInt()
                statusHeight = context.resources.getDimensionPixelSize(height)
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return statusHeight
        }

        /**
         * 获取软件盘的高度
         * @return
         */
        fun getSupportSoftInputHeight(mActivity: Activity): Int {
            val r = Rect()
            /**
             * decorView是window中的最顶层view，可以从window中通过getDecorView获取到decorView。
             * 通过decorView获取到程序显示的区域，包括标题栏，但不包括状态栏。
             */
            mActivity.window.decorView.getWindowVisibleDisplayFrame(r)
            //获取屏幕的高度
            val screenHeight = mActivity.window.decorView.rootView.height
            //计算软件盘的高度
            var softInputHeight = screenHeight - r.bottom
            /**
             * 某些Android版本下，没有显示软键盘时减出来的高度总是144，而不是零，
             * 这是因为高度是包括了虚拟按键栏的(例如华为系列)，所以在API Level高于20时，
             * 我们需要减去底部虚拟按键栏的高度（如果有的话）
             */
            if (Build.VERSION.SDK_INT >= 20) {
                // When SDK Level >= 20 (Android L), the softInputHeight will contain the height of softButtonsBar (if has)
                softInputHeight = softInputHeight - getSoftButtonsBarHeight(mActivity)
            }
            return softInputHeight
        }

        /**
         * 底部虚拟按键栏的高度
         * @return
         */
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
        private fun getSoftButtonsBarHeight(mActivity: Activity): Int {
            val metrics = DisplayMetrics()
            //这个方法获取可能不是真实屏幕的高度
            mActivity.windowManager.defaultDisplay.getMetrics(metrics)
            val usableHeight = metrics.heightPixels
            //获取当前屏幕的真实高度
            mActivity.windowManager.defaultDisplay.getRealMetrics(metrics)
            val realHeight = metrics.heightPixels
            return if (realHeight > usableHeight) {
                realHeight - usableHeight
            } else {
                0
            }
        }

        /**
         * 获取屏幕分辨率
         *
         * @param context
         * @return
         */
        fun getScreenDispaly(context: Context): IntArray {
            val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
            val width = windowManager.defaultDisplay.width // 手机屏幕的宽度
            val height = windowManager.defaultDisplay.height // 手机屏幕的高度
            return intArrayOf(width, height)
        }
    }
}